package com.turing.post.salesmanage.util;

import java.math.BigInteger;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import javax.ejb.Local;
import javax.ejb.Remote;

import com.turing.post.util.PCPSApplicationException;
import com.turing.post.util.PCPSWebInput;

/**
 * @author zxp
 * @Dec 22, 2012
 */
@Remote
@Local
public interface SaleOrderDao {

	/**
	 * 根据销售单编号查询销售单
	 * 
	 * @param saleOrderId
	 *            销售单编号
	 * @return 销售单
	 */
	public SaleOrder getSaleOrderBySaleOrderId(BigInteger saleOrderId);

	public SaleOrder getSaleOrderBySaleOrderSeqNo(String saleOrderSeqNo);

	/**
	 * 营销员业务统计表
	 * 
	 * @param input
	 * @param branchNo
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	public List<Object[]> getSalesFromSaleOrddr(PCPSWebInput input,
			String branchNo, String startDate, String endDate);

	/**
	 * 查询锁定销售单
	 * 
	 * @param saleOrderId
	 * @return
	 */
	public SaleOrder getSaleOrderForUpdate(BigInteger saleOrderId);

	/**
	 * 组合查询销售单
	 * 
	 * @param buyerType
	 *            购卡人类型
	 * @param name
	 *            购卡人姓名
	 * @param orderStatus
	 *            销售单状态
	 * @param startSaleAmount
	 *            起始销售单售卡金额
	 * @param endSaleAmount
	 *            终止销售单售卡金额
	 * @param startTime
	 *            起始销售时间
	 * @param endTime
	 *            终止销售时间
	 * @param saleBranchNo
	 *            销售批次号
	 * @param btnStatus
	 *            前台传入那种查询状态
	 * @param page
	 *            分页页码
	 * @return 销售单列表
	 */
	public List<SaleOrder> getSaleOrderListByCondition(PCPSWebInput webInput,
			String orderSeqNo, String buyerType, String name,
			String orderStatus, BigInteger startSaleAmount,
			BigInteger endSaleAmount, String startTime, String endTime,
			String saleBranchNo, String btnStatus, String paidType,String feeType, Integer page);

	/**
	 * 打包激活销售单列表
	 * 
	 * @param webInput
	 * @param orderSeqNo
	 * @param startSaleAmount
	 * @param endSaleAmount
	 * @param startTime
	 * @param endTime
	 * @param saleBranchNo
	 * @return
	 */
	public List<SaleOrder> getActivateSaleOrderList(PCPSWebInput webInput,
			String orderSeqNo, BigInteger startSaleAmount,
			BigInteger endSaleAmount, String startTime, String endTime,
			String saleBranchNo, String activateBranchNo, String orderStatus,
			String paidType,String feeType);

	/**
	 * 组合查询销售单
	 * 
	 * @param buyerType
	 *            购卡人类型
	 * @param name
	 *            购卡人姓名
	 * @param orderStatus
	 *            销售单状态
	 * @param startSaleAmount
	 *            起始销售单售卡金额
	 * @param endSaleAmount
	 *            终止销售单售卡金额
	 * @param startTime
	 *            起始销售时间
	 * @param endTime
	 *            终止销售时间
	 * @param saleBranchNo
	 *            销售批次号
	 * @param btnStatus
	 *            前台传入那种查询状态
	 * @return 销售单记录数
	 */
	public BigInteger getSaleOrderTotalByCondition(PCPSWebInput webInput,
			String orderSeqNo, String buyerType, String name,
			String orderStatus, BigInteger startSaleAmount,
			BigInteger endSaleAmount, String startTime, String endTime,
			String saleBranchNo, String btnStatus, String paidType,String feeType);

	/**
	 * 新增
	 * 
	 * @param saleOrder
	 * @throws PCPSApplicationException
	 */
	public void insertSaleOrder(SaleOrder saleOrder)
			throws PCPSApplicationException;

	/**
	 * 修改
	 * 
	 * @param saleOrder
	 * @throws PCPSApplicationException
	 */
	public void updateSaleOrder(SaleOrder saleOrder)
			throws PCPSApplicationException;

	/**
	 * 根据销售单号查询总售卡金额
	 * 
	 * @param saleOrderIds
	 * @return
	 */
	public BigInteger getAllTotalSaleAmountBySaleOrderIdArray(
			BigInteger[] saleOrderIds);

	/**
	 * 根据销售单号数组获取销售单所属机构号列表
	 * 
	 * @param saleOrderIds
	 * @return
	 */
	public HashMap<Integer, String> getSaleBranchNoListBySaleOrderIds(
			BigInteger[] saleOrderIds);

	/**
	 * 根据激活单查询销售单列表
	 * 
	 * @param activeOrderId
	 * @return
	 */
	public List<SaleOrder> getSaleOrderListByActiveOrderId(
			BigInteger activeOrderId, String btnStatus);

	/**
	 * 根据条件检索销售单信息列表--报表（西邮寄卡实名制信息统计表）
	 * 
	 * @param saleBranchNo
	 *            销售机构
	 * @param buyerType
	 *            购卡人类型
	 * @return
	 */
	public List<Object[]> getSaleOrderByRealName(PCPSWebInput webInput,
			String saleBranchNo, Date sratDate, Date endDate);

	/**
	 * 风险预警数据查询 查询当天销售单中为单位购卡的所有代理人列表
	 * 
	 * @param date
	 * @return
	 */
	public List<Object> getProxybuyerListForAlarm(String date);

	/**
	 * 代理人购卡个数
	 * 
	 * @param proxyBuyer
	 *            购卡代理人
	 * @return
	 */
	public Integer getProxybuyerSaleOrderNum(BigInteger proxyBuyer);

	/**
	 * 查询可疑销售单信息
	 * 
	 * @param proxyBuyer
	 * @return
	 */
	public List<SaleOrder> getProxyBuyerSaleOrderList(BigInteger proxyBuyer);

	/**
	 * 风险预警数据查询 同一购卡人使用转账方式购卡，转账账户名称与购卡人名称不符的
	 * 
	 * @param
	 * @return
	 */
	public List<Object[]> getSaleOrderForAlarm(Date trandate,
			String issuecompanyno);

	/**
	 * 风险预警数据查询 同一经办人在短时期内进行多次购买的未超过限额
	 * 
	 * @param date
	 * @return
	 */
	public List<Object[]> getSaleOrderMoreTimes(String issuecompanyno,
			Date startTime, Date endTime, double amount, Integer num);

	/**
	 * 根据时间段，购卡人主题，发卡商检索销售单清单
	 */
	public List<SaleOrder> getSaleOrderByDateAndPer(String issueCompanyNo,
			Date startTime, Date endTime, String BuyerId);

	/**
	 * 风险预警数据查询 同一购卡人一周内累计购卡满足限额要进行大额登记
	 * 
	 * @param issueCompanyNo
	 * @param startTime
	 * @param endTime
	 * @return
	 */
	public List<SaleOrder> getSaleOrderByAlarmRule3(String issueCompanyNo,
			String startTime, String endTime);

	public List<SaleOrder> getSaleOrderListByVoucherNo(String voucherNo);

	/**
	 * 卡类报表 卡销售明细表
	 * 
	 * @param branchNo
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	public List<Object[]> getSaleOrderListReportByCond(PCPSWebInput webInput,
			String branchNo, String startDate, String endDate);

	/**
	 * 卡销售统计表 激活的销售单
	 * 
	 * @param webInput
	 * @param branchNo
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	public List<Object[]> getSaleOrderCountReportByCond(PCPSWebInput webInput,
			String branchNo, String startDate, String endDate);

	/**
	 * 授信付款的销售单查询列表
	 * 
	 * @param webInput
	 * @param orderSeqNo
	 * @param startTime
	 * @param endTime
	 * @param saleBranchNo
	 * @param page
	 * @return
	 */
	public List<SaleOrder> getSaleOrderCreditPayListByCondition(
			PCPSWebInput webInput, String orderSeqNo, String startTime,
			String endTime, String saleBranchNo, Integer page);

	/**
	 * 授信付款的销售单查询总数
	 * 
	 * @param webInput
	 * @param orderSeqNo
	 * @param startTime
	 * @param endTime
	 * @param saleBranchNo
	 * @return
	 */
	public BigInteger getSaleOrderCreditPayTotalByCondition(
			PCPSWebInput webInput, String orderSeqNo, String startTime,
			String endTime, String saleBranchNo);

	/**
	 * 根据已售卡序号,获取销售单信息
	 * 
	 * @param webInput
	 * @param cardSeqNo
	 * @return
	 */
	public SaleOrder getSaleOrderByCardSeqNo(PCPSWebInput webInput,
			String cardSeqNo);

	/**
	 * 组合查询销售单总金额，手续费，总付款，总张数
	 * 
	 * @param buyerType
	 *            购卡人类型
	 * @param name
	 *            购卡人姓名
	 * @param orderStatus
	 *            销售单状态
	 * @param startSaleAmount
	 *            起始销售单售卡金额
	 * @param endSaleAmount
	 *            终止销售单售卡金额
	 * @param startTime
	 *            起始销售时间
	 * @param endTime
	 *            终止销售时间
	 * @param saleBranchNo
	 *            销售批次号
	 * @param btnStatus
	 *            前台传入那种查询状态
	 * @return 销售单列表
	 */
	public Object[] getSaleOrderListByConditionSum(PCPSWebInput webInput,
			String orderSeqNo, String buyerType, String name,
			String orderStatus, BigInteger startSaleAmount,
			BigInteger endSaleAmount, String startTime, String endTime,
			String saleBranchNo, String btnStatus, String paidType,String feeType);

	/**
	 * 打包激活销售单列表,组合查询销售单总金额，手续费，总付款，总张数
	 * 
	 * @param webInput
	 * @param orderSeqNo
	 * @param startSaleAmount
	 * @param endSaleAmount
	 * @param startTime
	 * @param endTime
	 * @param saleBranchNo
	 * @return
	 */
	public Object[] getActivateSaleOrderListSum(PCPSWebInput webInput,
			String orderSeqNo, BigInteger startSaleAmount,
			BigInteger endSaleAmount, String startTime, String endTime,
			String saleBranchNo, String activateBranchNo, String orderStatus,
			String paidType,String feeType);

	/**
	 * 获取某发卡机构下属销售机构某日销售单手续费总和
	 * 
	 * @param saleBrchNos
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	public BigInteger getSaleOrderFactFeeBySaleBrchNos(String saleBrchNos,
			String startDate, String endDate);
}